'use strict';
// const utils = require("@hetao-cli/utils");
const commander = require("commander");
const semver = require("semver");
// log初始化在引入时
const log = require("@hetao-cli/log");
const {getSemverVersion} = require("@hetao-cli/get-npm-info");
const colors = require("colors/safe");
const os = require("os");
const fs = require("fs");

const pkg = require("../package.json");
const constant = require("./constant");
const path = require("path");

const program = new commander.Command();
const homedir = os.homedir();

function core() {
    try {
        checkPkgVersion();
        checkNodeVersion();
        checkRoot();
        checkUserHome();
        checkaInputArgs();
        checkEnv();
        checkGlobalUpdate();
    } catch (error) {
        log.error(error.message);
    }
    registerCommand();
}
// 1
function checkPkgVersion() {
    log.notice("cli",pkg.version);
    console.log('pkg.version :>> ', pkg.version);
}
// 2
function checkNodeVersion() {
    // 1. 获取当前node版本号
    // (process.version)
    const currentVersion = process.version;
    const lowestNodeVersion = constant.LOW_NODE_VERSION;
    if(semver.gt(lowestNodeVersion, currentVersion)) {
        throw Error(colors.green("node 版本太低"));
    };
}
// 3 process,.geteuid
function checkRoot() {
    // 原理使用process.setuid来进行修改，可以使用process.env.SUDO_GID信息获取
    const rootCheck = require("root-check");
    rootCheck(); 
    console.log(process.geteuid()); // 管理员返回0，其余用户返回各自编号，macos下一般是501，陈毅的代号
}
// 4 
function checkUserHome() {
    if(!homedir) {
        throw Error("用户目录不存在");
    }
}

// 5 检查入参
let args;
function checkaInputArgs() {
    const minimist = require("minimist");
    args = minimist(process.argv.slice(2));
    console.log('args :>> ', args);
    process.env.LOG_LEVEL = args.debug ? 'verbose' : "info";
    log.level = process.env.LOG_LEVEL;
}

// 6. 检查环境变量：
let config;
function checkEnv()  {
    const dotenv = require("dotenv");
    // 如果用户主目录下存在.env文件，使用该文件
    // dotenv会将.env的变量放入process下的env下
    const dotenvPath = path.resolve(homedir, ".env");
    if(fs.existsSync(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        });
    } 
    createDefaultConfig();
    log.verbose("环境变量**********", process.env.CLI_HOME_PATH);
}

function createDefaultConfig() {
    // 这逻辑有什么用？？？
    const cliConfig = {
        home: homedir
    };
    if(process.env.CLI_HOME) {
        cliConfig["cliHome"] = path.join(homedir, process.env.CLI_HOME);
    } else {
        cliConfig["cliHome"] = path.join(homedir, constant.DEFAULT_CLI_HOME);
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

// 检查是否为最新版本 
function checkGlobalUpdate() {
    // 1. 获取当前版本号及模块名
    const { name: packageName, version:currentVersion} = pkg;
    console.log('packageName :>> ', packageName);
    // 2. 调用npm api及模块名获取所有的版本号 registry.npmjs.org/<packageName>
    getSemverVersion(packageName).then(lastVersion => {
        if(lastVersion && semver.gt(lastVersion, '0.0.3')) {
            log.warn("版本更新提示",colors.yellow(`请手动更新  ${packageName} 版本 ${currentVersion} ---> ${lastVersion}
更新命令: npm install -g ${packageName}`))
        }
    });
    // 3. 提取所有版本号， 获取最新的版本号
    // 4. 获取最大的版本号进行比较，并根据结果进行提示

}

function registerCommand() {
    program
        .name("hetao")
        .usage("<command> [options]")
        .version("1.2.3")
        .option("-d, --debug", "是否开启调试模式", false)
        .option("-fp, --filePath", "输入要处理的文件名")

    program.on("option:debug", function() {
        // set log level
        if(program.debug) {
            process.env.LOG_LEVEL = "verbose"
        } else {
            process.env.LOG_LEVEL = "info";
        }
        
    });
    program.on("option:filePath", function() {
        // set log level
        
        
    });
    // 所有命令都会触发，可以对命令进行检查，提示未知命令
    // program.commands
    program.on("command:*", function() {
        // console.log("****************", program);

    });
    // program
    //     .command("init [name]")
    //     .option("-f, --force","use force init", false)
    //     .action(() => {

    //     })
    program.parse(process.argv)
}


module.exports = core;
